自从上次推送了链表的基本操作后,现在就来试着写一写比较复杂的东西。
比如,合并两个有序的链表:
L1: 1 1 2 4
L2: 1 2 3 5 6
我们需要的链表是:1 1 1 2 2 3 4 5 6
思考一下,有两种简单粗暴办法:
第一种:
我们建立一个链表头head,比较prev1的值和prev2的值,谁小谁放在head后面,然后位置往后移(不创建新结点,会破坏原链表);
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null){
return l2;
}
if(l2 == null){ //空链表情况
return l1;
}
ListNode prev1=l1;
ListNode prev2=l2;
ListNode head=null;//新链表头
ListNode tail=null;//新链表尾
while(prev1 !=null && prev2 !=null){
if(prev1.val <= prev2.val){
if(head == null){
head=prev1; //第一个节点,给head和tail同时赋值
tail=prev1;
prev1=prev1.next;
}
else{
tail.next=prev1;
tail=tail.next;
prev1=prev1.next;
}
}
else{
if(head == null){
head=prev2;
tail=prev2;
prev2=prev2.next;
}
else{
tail.next=prev2;
tail=tail.next;
prev2=prev2.next;
}
}
}
if(prev1 == null){ //看谁结束了,放在后面
tail.next=prev2;
return head;
}
if(prev2 == null){
tail.next=prev1;
return head;
}
return head;
}
}
第两种:思想是一样的,但是我们不破坏原链表,新建结点重新创建。
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null ){
return l2;
}
if(l2 == null ){
return l1;
}
ListNode prev1=l1;
ListNode prev2=l2;
ListNode head=new ListNode(-1);
ListNode cur=head;
while(prev1 !=null && prev2 !=null){
if(prev1.val >= prev2.val){
ListNode Node=new ListNode(prev2.val);
cur.next=Node;
cur=cur.next;
prev2=prev2.next;
}
else{
ListNode Node=new ListNode(prev1.val);
cur.next=Node;
cur=cur.next;
prev1=prev1.next;
}
}
if(prev1 == null){
cur.next=prev2;
return head.next;
}
if(prev2 ==null){
cur.next=prev1;
return head.next;
}
return head.next;
}
}
可以看得出来,第二种代码比较短,也好理解;
(0ms是第一种,1ms是第二种)