解法一:
这种解法就是默认把l2
的结点插入到l1
当中,可把l1
和l2
直接当做移动指针,并为l1
设置一个前驱指针pre
, 再比较l1
和l2
当前结点的值哪个更小,如果l1
的值小于l2
,则将l2
这个结点插入到l1
这个结点之前,移动pre
和l2
,否则移动pre
和l1
。逐个比较每个结点,直到这两个移动指针任意一个为空。但是这种想法就还需要考虑l1
是否为空、插入的结点位置是不是在头结点之前等。略微有点麻烦,这个运行时间短,占用内存大一些。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = l1, pre = l1;
if (head == null) return l2;
while(l1!=null && l2!=null){
if (l1.val >= l2.val){
if (head == l1) {
pre = l2;
l2 = l2.next;
pre.next = l1;
head = pre;
}else{
pre.next = l2;
pre = pre.next;
l2 = l2.next;
pre.next = l1;
}
}else{
if (head != l1) pre = pre.next;
l1 = l1.next;
}
}
if (l2 != null){
pre.next = l2;
}
return head;
}
}
解法二:
对于链表操作来说,额外新建一个无实值的头结点是真的挺方便的,这种解法就是,直接把更小的那个结点链入新表就行, l e e t c o d e leetcode leetcode上运行时间长一点,但是占用内存少一点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = new ListNode(-1);
ListNode pre = head;
while(l1!=null && l2!=null){
if (l1.val <= l2.val){
pre.next = l1;
l1 = l1.next;
}else{
pre.next = l2;
l2 = l2.next;
}
pre = pre.next;
}
pre.next = (l1 == null)? l2:l1;
head = head.next;
return head;
}
}
这个问题当然还能用递归做,递归返回较小值的结点。