1、你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null
public ListNode addLists(ListNode l1, ListNode l2) {
// write your code here
ListNode dummy = new ListNode(-1);
ListNode p1 = l1;
ListNode p2 = l2;
ListNode p = dummy;
int flag = 0;
while (p1 != null || p2 != null) {
int temp = flag;
if (p1 != null) {
temp += p1.val;
p1 = p1.next;
}
if (p2 != null) {
temp += p2.val;
p2 = p2.next;
}
if (temp > 9) {
temp -= 10;
flag = 1;
} else {
flag = 0;
}
p.next = new ListNode(temp);
p = p.next;
}
if (flag == 1) {
p.next = new ListNode(1);
}
return dummy.next;
}
2、假定用一个链表表示两个数,其中每个节点仅包含一个数字。假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式。
给出 6->1->7 + 2->9->5。即,617 + 295。
返回 9->1->2。即,912 。
思路:翻转之后转化成上面的问题,然后计算结果,然后在翻转一次就行了
public ListNode addLists2(ListNode l1, ListNode l2) {
// write your code here
ListNode l11 = reverse(l1);
ListNode l22 = reverse(l2);
ListNode p1 = l11;
ListNode p2 = l22;
ListNode dummy = new ListNode(-1);
ListNode p = dummy;
int flag = 0;
while (p1 != null || p2 != null) {
int temp = flag;
if (p1 != null) {
temp += p1.val;
p1 = p1.next;
}
if (p2 != null){
temp += p2.val;
p2 = p2.next;
}
if (temp > 9) {
temp -= 10;
flag = 1;
} else {
flag = 0;
}
ListNode node = new ListNode(temp);
p.next = node;
p = p.next;
}
if (flag == 1) {
ListNode node = new ListNode(1);
p.next = node;
}
return reverse(dummy.next);
} public ListNode reverse (ListNode head) {
ListNode newhead = null;
while (head != null) {
ListNode temp = head.next;
head.next = newhead;
newhead = head;
head = temp;
}
return newhead;
}
【链表---两个链表相加求和】
推荐阅读
- 数据结构|C++技巧(用class类实现链表)
- 数据结构学习指导|数据结构初阶(线性表)
- 链表结点的查找
- PTA题目集|6-2 单链表结点删除(20 分)_单链表的删除节点的两种方式——还是双指针和链表覆盖好用
- PTA题目集|6-5 链表逆置(20 分)——头插或者重开新链表头插
- PTA题目集|6-4 建立学生信息链表(20 分)——尾插建链表_题程序访问是越界——真是醉了,你自己跑下是会抛出异常的
- 链表|C语言课程设计——图书管理系统
- java学习|【算法学习】链表数相加(Java)
- 链表的应用
- C++|单链表的增、删、改、减(C++)