public class DemoApplicationTests {
@Test
public void contextLoads() {
ListNode l1 = new ListNode(2);
ListNode l1_2 = new ListNode(4);
ListNode l1_3 = new ListNode(3);
l1.next=l1_2;
l1_2.next=l1_3;
ListNode l2 = new ListNode(5);
ListNode l2_2 = new ListNode(6);
ListNode l2_3 = new ListNode(4);
l2.next=l2_2;
l2_2.next=l2_3;
addTwoNumbers(l1,l2);
}
/**
* 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
* 输出:7 -> 0 -> 8
* 原因:342 + 465 = 807
* @param l1
* @param l2
* @return
*/
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//第一步 先新建一个结果链表、当前链表、进位
ListNode result=new ListNode(0);
ListNode cur=result;
int i=0;
while (l1!=null||l2!=null){
//避免链表长度不一致
if(l1==null)l1.val=0;
if(l2==null)l2.val=0;
//计算当前节点的和
int num=i+l1.val+l2.val+i;
//赋值进位
i=num/10;
//1.cur:0->7 result:0->7 2. cur:7->0 result:0->7->0 3. cur:0->8 result:0->7->0->8
cur.next=new ListNode((num)%10);添加结点
//1.cur:7 result:0->7 2. cur:0 result:0->7->0 3. cur:8 result:0->7->0->8
cur=cur.next;//移动节点
if(l1!=null)l1=l1.next;
if(l2!=null)l2=l2.next;
}
//如果最后有进位则结果指向新的节点node
if (i > 0) {
result.next = new ListNode(i);
}
return result.next;
}
}
/**
* 一直疑惑的问题是明明cur=result 他们的都应该引用一个地址,为什么cur在发生改变的时候,result不发生改变呢?
* 第一次进入while循环的时候 假设rusult和cur的r地址都是@0001
* 在cur.next被赋值的时候,rusult和cur的r地址都是@0001 但是cur.next这个节点的地址是@0002
* 所以cur=cur.next的时候 rusult地址是@0001 rusult.next,cur和cur.next地址为@0002
* 所以在下层循环时 因为cur和rusult.next的地址相同,所以在给cur.next赋值的时候,rusult.next.next也会呗赋值
*/
LeetCode02-链表中的两数之和
最新推荐文章于 2023-04-05 00:00:43 发布