题目
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

我的解法:
/**
* 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 cur =new ListNode(0),dum=cur;
while(l1!=null && l2!=null){
if(l1.val>=l2.val)
{
cur.next=l2;
l2=l2.next;
}
else
{
cur.next=l1;
l1=l1.next;
}
cur=cur.next;
}
if(l1==null && l2==null) return dum.next;
if(l1==null)cur.next=l2;
if(l2==null)cur.next=l1;
return dum.next;
}
}
提问:dum和cur不是引用类型吗?改变cur的话为什么dum不变呢
解答:cur 和 dum 引用指向某节点,但 cur 和 dum 是两个独立变量,保存此节点的地址。当改变 cur, dum仍然指向这个节点,所以没有变化~
可以看看JVM的知识,对于Java来说:对象生成在堆中,而dum和cur是栈中的局部变量,存储的是指向堆中实例数据的直接指针(或句柄)。 比如说:
cur指向A(A.val=1),dum也指向A
如果修改了A的值(A.val=0),这是修改了实例数据的值,那么cur和dum获取到A都为0
但是如果cur指向了B,这是修改了局部变量的值,dum不会变化,还是指向A
解法一:递归解法
public ListNode mergeTwoLists(ListNode linked1, ListNode linked2) {
if (linked1 == null)
return linked2;
if (linked2 == null)
return linked1;
if (linked1.val < linked2.val) {
linked1.next = mergeTwoLists(linked1.next, linked2);
return linked1;
} else {
linked2.next = mergeTwoLists(linked1, linked2.next);
return linked2;
}
}
解法二: 非递归解法
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dum = new ListNode(0), cur = dum;
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 ? l1 : l2;
return dum.next;
}
}
本文详细解析了如何合并两个已排序的链表,并保持新链表的递增排序。提供了两种解法,一种是非递归方式,通过创建一个虚拟头节点简化合并过程;另一种是递归方式,更简洁但可能带来更深的调用栈。讨论了Java中局部变量与对象引用的区别。
653

被折叠的 条评论
为什么被折叠?



