剑指 Offer 25(链表5).合并两个排序的链表
问题描述:
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
解题思路:思路连接
思路一:迭代
- 设置
integer
为头结点,放置于新链表之前,最后返回的就是integer.next
;设置cur为当前节点,从integer
开始; - 当两个链表都非空时进入循环,令新链表的下一个节点
cur.next
为val更小的节点,相应的链表节点后移一位; - 每次循环记得cur也要后移一位;
- 如果循环结束后还有链表非空,cur指向非空链表;
- 返回
integer.next
;
思路二:递归
- 特判:如果有一个链表为空,返回另一个链表
- 如果l1节点值比l2小,下一个节点应该是l1,应该return l1,在return之前,指定l1的下一个节点应该是l1.next和l2俩链表的合并后的头结点
- 如果l1节点值比l2大,下一个节点应该是l2,应该return l2,在return之前,指定l2的下一个节点应该是l1和l2.next俩链表的合并后的头结点
迭代代码实现
/**
* 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) {
ListNode integer = new ListNode();
ListNode cur = integer;
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;
}
//判断l1链表是否比l2链表要长,如果长,则cur的下一个结点为l1链表后面的元素,
//因为两个链表中的元素都是递增的
cur.next = l1 != null ? l1:l2;
return integer.next;
}
}
递归代码实现
/**
* 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) {
if(l1 == null || l2 == null){
return l1 != null ? l1:l2;
}
if(l1.val <= l2.val){
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}else{
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
}