由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 分享一个链表相关的面试题
相关主题
一道C面试题MS面试题
问一个链表的问题一道面试题
发一道面试题一个GOOG的二叉树面试题
请教一个C++的小问题: Node *&curr Vs Node *curr请问一个简单的面试题
感觉今天结结实实被烙印阴了请教一道面试题
leetcode上这个链表节点的定义是什么意思?ListNode(int x) : val(x), next(NULL) {}How to turn a binary search tree into a sorted array?
问一道常见面试题,reverse a linked list题目: iterative binary tree post order traversal
一道链表题及其变种问一道amazon面试题
相关话题的讨论汇总
话题: node话题: curr话题: n1话题: last话题: n2
进入JobHunting版参与讨论
1 (共1页)
p*u
发帖数: 136
1
两个单链表(singly linked list),每一个节点里面一个0-9的数字,输入就相当于
两个大数了。然后返回这两个数的和(一个新list)。这两个输入的list长度相等。
要求是:1. 不用递归。2. 要求算法只遍历两个list一次。
1,算法没想到,在别的地方看到的。
2,第一次写挫了,第二次写用了15分钟,用了15分钟写case调试通过
https://gist.github.com/pdu/8083cd76da5976eac5ac
f****l
发帖数: 8042
2
Thanks
f*******w
发帖数: 1243
3
所以一开始指向的是位数最高的?
走一遍的时候把sum存到一个新的list,不考虑进位,然后再走一遍新的list,然后翻
转?
B*****g
发帖数: 34098
4
走到下一位时存上一位的到新list

【在 f*******w 的大作中提到】
: 所以一开始指向的是位数最高的?
: 走一遍的时候把sum存到一个新的list,不考虑进位,然后再走一遍新的list,然后翻
: 转?

f*******w
发帖数: 1243
5

不行吧
比如 88888 + 11112

【在 B*****g 的大作中提到】
: 走到下一位时存上一位的到新list
g****o
发帖数: 547
6
head存高位还是低位
低位的话,leetcode有这题啊

【在 p*u 的大作中提到】
: 两个单链表(singly linked list),每一个节点里面一个0-9的数字,输入就相当于
: 两个大数了。然后返回这两个数的和(一个新list)。这两个输入的list长度相等。
: 要求是:1. 不用递归。2. 要求算法只遍历两个list一次。
: 1,算法没想到,在别的地方看到的。
: 2,第一次写挫了,第二次写用了15分钟,用了15分钟写case调试通过
: https://gist.github.com/pdu/8083cd76da5976eac5ac

p*u
发帖数: 136
7
题目要求存低位,存高位就太简单了。
关键点是:
1,只遍历一次,不能递归
2,比较容易漏掉corner case
3,白板写有点困难~~

【在 g****o 的大作中提到】
: head存高位还是低位
: 低位的话,leetcode有这题啊

z*********8
发帖数: 2070
8
head存高位比较难吧 或者说不可能一次遍历就搞定

【在 p*u 的大作中提到】
: 题目要求存低位,存高位就太简单了。
: 关键点是:
: 1,只遍历一次,不能递归
: 2,比较容易漏掉corner case
: 3,白板写有点困难~~

B*****g
发帖数: 34098
9
有道理,我再想想

【在 f*******w 的大作中提到】
:
: 不行吧
: 比如 88888 + 11112

B*****g
发帖数: 34098
10
要不,只要是9就不加到新list,count一共多少个9,到第一个,不是9的再决定往上放
10000...还是就放9999...

【在 f*******w 的大作中提到】
:
: 不行吧
: 比如 88888 + 11112

相关主题
leetcode上这个链表节点的定义是什么意思?ListNode(int x) : val(x), next(NULL) {}MS面试题
问一道常见面试题,reverse a linked list一道面试题
一道链表题及其变种一个GOOG的二叉树面试题
进入JobHunting版参与讨论
f*******w
发帖数: 1243
11

所以最坏的情况需要O(n)额外空间?
我也不知道怎样做毕竟好……

【在 B*****g 的大作中提到】
: 要不,只要是9就不加到新list,count一共多少个9,到第一个,不是9的再决定往上放
: 10000...还是就放9999...

d****n
发帖数: 233
12
A Java version
public static Node add(Node n1, Node n2) {
Node head = new Node(0);
Node back = head;
Node front = head;
while(n1 != null) {
int v = n1.m_value + n2.m_value;
front.next = new Node(v%10);
if (v > 9) {
back.m_value++;
while(back != front){
back = back.next;
back.m_value = 0;
}
back = front = front.next;
}
else if (v < 9){
back = front = front.next;
}
else
front = front.next;
n1 = n1.next;
n2 = n2.next;
}

return head.m_value != 0? head : head.next;
}

【在 B*****g 的大作中提到】
: 要不,只要是9就不加到新list,count一共多少个9,到第一个,不是9的再决定往上放
: 10000...还是就放9999...

p*u
发帖数: 136
13
赞,你这样写比较巧妙,比我的版本要好看多了。
指正一个小错误:
while(back != front.next){ //这里改为front.next
back = back.next;
back.m_value = 0;
}
你试试这个例子:
445 + 555 = 1000
但是你的代码结果是:1090

【在 d****n 的大作中提到】
: A Java version
: public static Node add(Node n1, Node n2) {
: Node head = new Node(0);
: Node back = head;
: Node front = head;
: while(n1 != null) {
: int v = n1.m_value + n2.m_value;
: front.next = new Node(v%10);
: if (v > 9) {
: back.m_value++;

d****n
发帖数: 233
14
试了一下, 好像我是对的。

【在 p*u 的大作中提到】
: 赞,你这样写比较巧妙,比我的版本要好看多了。
: 指正一个小错误:
: while(back != front.next){ //这里改为front.next
: back = back.next;
: back.m_value = 0;
: }
: 你试试这个例子:
: 445 + 555 = 1000
: 但是你的代码结果是:1090

p*u
发帖数: 136
15
嗯,刚看了下你是对的。不好意思看错了

【在 d****n 的大作中提到】
: 试了一下, 好像我是对的。
B*****g
发帖数: 34098
16
??O(1)呀

【在 f*******w 的大作中提到】
:
: 所以最坏的情况需要O(n)额外空间?
: 我也不知道怎样做毕竟好……

p*******2
发帖数: 50
17
mark
关键是找到每次进位链开始和结束的位置吧?
c********w
发帖数: 2438
18
双指针
一个curr就指向当前的加的结果
一个before指向“9”之前的listnode

【在 p*******2 的大作中提到】
: mark
: 关键是找到每次进位链开始和结束的位置吧?

l****1
发帖数: 33
19
貌似这个可以:
S=0
C=0
while (not end) {
if (a + b >= 10) {
curr = a + b - 10;
C += 1
} else {
curr = a + b;
}
S = 10 * S + curr;
C = 10 * C;
}
S = S + C;
s***e
发帖数: 403
20
首先问题是这两个数的长度是否相同?
l****1
发帖数: 33
21
来个C版本的:
static void add_two(struct list *sum, const struct list *a,
const struct list *b)
{
struct list *n1, *n2;
struct list *curr, *last, *end = sum;
char res;
/* reseve one node for carry bit */
curr = alloc_node();
curr->val = 0;
add_node(sum, curr);
end = curr;
last = curr;
n1 = a->next;
n2 = b->next;
while (n1) {
res = n1->val + n2->val;
if (res >= 10) {
last->val++;
res -= 10;
if (last != end) {
for (last = last->next; last != NULL;
last = last->next)
last->val = 0;
last = end;
}
}
curr = alloc_node();
curr->val = res;
add_node(end, curr);
if (res != 9)
last = curr;
n1 = n1->next;
n2 = n2->next;
end = curr;
}
}
l*n
发帖数: 529
22
只能遍历两个输入list一次,没说不能遍历新list多次。把新list逆序记录,有进位就
处理进位,最后再反转。

【在 p*u 的大作中提到】
: 两个单链表(singly linked list),每一个节点里面一个0-9的数字,输入就相当于
: 两个大数了。然后返回这两个数的和(一个新list)。这两个输入的list长度相等。
: 要求是:1. 不用递归。2. 要求算法只遍历两个list一次。
: 1,算法没想到,在别的地方看到的。
: 2,第一次写挫了,第二次写用了15分钟,用了15分钟写case调试通过
: https://gist.github.com/pdu/8083cd76da5976eac5ac

1 (共1页)
进入JobHunting版参与讨论
相关主题
问一道amazon面试题感觉今天结结实实被烙印阴了
一道面试题:Flatten a multilevel linked listleetcode上这个链表节点的定义是什么意思?ListNode(int x) : val(x), next(NULL) {}
来个原创面试题,逗大家玩问一道常见面试题,reverse a linked list
面试题一道链表题及其变种
一道C面试题MS面试题
问一个链表的问题一道面试题
发一道面试题一个GOOG的二叉树面试题
请教一个C++的小问题: Node *&curr Vs Node *curr请问一个简单的面试题
相关话题的讨论汇总
话题: node话题: curr话题: n1话题: last话题: n2