题目描述
解题
合并两个递增排序的链表并不难,解法也有很多,这里推荐两种解法:
1.带伪头节点的双指针解法
这种方法其实本质上还是双指针的运用,但它构造了一个伪头节点,这个带伪头节点的链表就是合并之后的新链表:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//dummyHead 为伪头节点,cur 是指向dummyHead 链表当前节点的游标
ListNode dummyHead = new ListNode(0),cur = dummyHead;
while(l1 != null && l2 != null){
if(l1.val<l2.val){
cur.next = l1;
l1 = l1.next;
}else{
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
cur.next = l1==null?l2:l1;
return dummyHead.next;
}
}
2.递归
递归大法理解起来就很简单:递归依序访问两个链表,每次返回两个链表中最小的节点,连接到合并链表上。
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null || l2 == null){
return l1==null?l2:l1;
}
ListNode newNode;
if(l1.val<l2.val){
newNode = l1;
newNode.next = mergeTwoLists(l1.next,l2);
}else{
newNode = l2;
newNode.next = mergeTwoLists(l1,l2.next);
}
return newNode;
}
}