一般说来,合并有序链表都会定义一个新的链表存放处理后的结果,笔者在想能不能利用原有两个链表的存储空间,不占用额外的存储空间,只在两个链表之间进行连接操作。以下为代码实现。
但是这样会破坏原有链表的值。
/**
* @author haojiajin
* @version : MergeSortedList.java, v 0.1 2019-09-12 16:20
*/
public class MergeSortedList {
public static class ListNode {
int val;
ListNode next;
ListNode(int x){
val = x;
}
}
private static ListNode merge(ListNode l1, ListNode l2) {
//哨兵,方便进行结果返回
ListNode result = new ListNode(0);
result.next = l1;
ListNode pre = result;
while (l1 != null && l2 != null) {
if(l1.val == l2.val) {
ListNode temNode = l2;
l2 = l2.next;
temNode.next = l1.next;
l1.next = temNode;
l1 = temNode.next;
pre = temNode;
} else if(l1.val > l2.val) {
ListNode temNode = l2;
l2 = l2.next;
temNode.next = l1;
pre.next = temNode;
pre = temNode;
} else {
pre = l1;
l1 = l1.next;
}
}
if(l2 != null) {
pre.next = l2;
}
return result.next;
}
public static void main(String[] args) {
ListNode l2 = new ListNode(2);
ListNode l3 = new ListNode(5);
ListNode l4 = new ListNode(18);
ListNode l5 = new ListNode(20);
l4.next = l5;
l3.next = l4;
l2.next = l3;
ListNode l6 = new ListNode(1);
ListNode l7 = new ListNode(3);
ListNode l8 = new ListNode(5);
ListNode l9 = new ListNode(6);
ListNode l10 = new ListNode(7);
ListNode l11 = new ListNode(10);
l10.next = l11;
l9.next = l10;
l8.next = l9;
l7.next = l8;
l6.next = l7;
ListNode result = merge(l2,l6);
while (result != null){
System.out.println(result.val);
result = result.next;
}
}
}
public ListNode merge(ListNode l1, ListNode l2) {
// 哨兵
ListNode prehead = new ListNode(-1);
ListNode prev = prehead;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
prev.next = l1;
l1 = l1.next;
} else {
prev.next = l2;
l2 = l2.next;
}
prev = prev.next;
}
prev.next = l1 == null ? l2 : l1;
return prehead.next;
}