原题链接: https://leetcode.com/problems/merge-two-sorted-lists/
1. 题目介绍
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
合并两个有序链表,要求合并后的新链表也是有序的。
Example:
Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4
2. 解题思路
注: 本解法参考了 https://www.cnblogs.com/lightwindy/p/8503688.html
2.1 解法1:建立新链表
可以新建一个链表,然后比较 l1 和 l2 链表中的节点,选取其中较小的那个加入总链表。最后当 l1 和 l2 中的一个遍历完后,再把没有走完的那个链表的剩余部分加进总链表。
实现代码
/**
* 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) {
//定义一个新的链表,这个新链表的辅助节点是assist,它位于链表最前面
ListNode assist = new ListNode(0);
ListNode temp = assist;
while(l1 != null && l2 != null) {
if(l1.val < l2.val) {
temp.next = l1;
l1 = l1.next;
}else {
temp.next = l2;
l2 = l2.next;
}
temp = temp.next;
}
//循环结束,意味着必定有一个链表走完了
//于是把没有走完的那个链表的剩余部分加进总链表
temp.next = ( l1 != null ? l1 : l2);
return assist.next;
}
}
2.2 解法2:递归
比较两个链表当前节点的大小,如果 l1 的节点小,那就去比较 l1.next 和 l2 谁更小,依次递归下去。
实现代码
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2){
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1.val < l2.val){
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else{
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}