2025年10月12日 星期日

[2181] Merge Nodes in Between Zeros

寫出了好可怕的東西 (嘆氣)
想要把多出來的node free 掉,感覺是自討苦吃(?)
到底面試的時候在不在意這個呢QQ
把別人美美的code 貼在下面,過幾天再回來寫一次QQ
ps. 原來可以在while 裡面再搞一個while, 一次將中間的val 相加到底。
別人為什麼就那麼聰明呢QQ
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
#if 1
struct ListNode* mergeNodes(struct ListNode* head) {
struct ListNode* p1 = head;
struct ListNode* p2 = head;
int num = 0;
while (p2->next != NULL)
{
if (p2->next->val == 0)
{
p1->val = num;
num = 0;
struct ListNode* p_next = p1->next;
while (p_next!= p2->next)
{
struct ListNode* p_free;
p_free = p_next;
p_next = p_next->next;
p_free = NULL;
free(p_free);
}
if (p_next->next == NULL)
{
p1->next = NULL;
return head;
}
p1->next = p_next;
p1= p_next;
}
else
num += p2->next->val;
p2 = p2->next;
}
return head;
}
#else
struct ListNode* mergeNodes(struct ListNode* head) {
struct ListNode* t1 = head->next;
struct ListNode* t2 = t1;
while(t2!=NULL){
int sum = 0;
while(t2->val != 0){
sum+=t2->val;
t2=t2->next;
}
t1->val = sum;
t2=t2->next;
t1->next = t2;
t1=t1->next;
}
return head->next; // skip first 0
}
#endif

(隔兩天更)
把它塞到前面的版本: 
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeNodes(struct ListNode* head) {
struct ListNode* ptr = head->next;
struct ListNode* p_sum = head;
int num = 0;
while (ptr != NULL)
{
//printf("%d \n", ptr->val);
if (ptr->val != 0)
{
num +=ptr->val;
ptr = ptr->next;
continue;
}
p_sum->val = num;
num = 0;
if (ptr->next == NULL)
{
p_sum->next= NULL;
break;
}
p_sum->next = ptr;
p_sum = ptr;
ptr = ptr->next;
}
return head;
}

把它塞到後面的版本:
struct ListNode* mergeNodes(struct ListNode* head) {
struct ListNode* ptr=head->next;
struct ListNode* p_sum=head;

int num = 0;
while (ptr!= NULL)
{
if(ptr->val !=0)
{
num += ptr->val;
ptr = ptr->next;
continue;
}
ptr->val = num;
p_sum->next = ptr;
p_sum= ptr;
ptr = ptr->next;
num = 0;
}
return head->next;
}

沒有留言:

張貼留言