THE
問題
解決
コード
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
思路: 合并问题采用双指针的基础操作,没有快慢, 只有对比。 从左边遍历到右边, 哪一边能走就走哪一边。
- define left right =head, current.
- while(left &&right)
- - if left val < right val current = left; current = current->next; left = left->next ,
- - else current = right current = current ->next
-
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
ListNode* left = pHead1;
ListNode* right = pHead2;
if(left==NULL){
return right;
}
if(right==NULL){
return left;
}
ListNode *current = new ListNode(0);
ListNode* h = current;
while(left!=nullptr&&right!=nullptr){
if(left->val<=right->val){
// if we get same val , firt we make one into list , next step is another.
current->next = left;
current = current->next;
left = left->next;
}
else if (left->val>right->val){
current->next = right;
current = current->next;
right = right->next;
}
}
if(left)current->next = left;
if(right)current->next = right;
return h->next;
}
};
まとめと考察
- ==の場合にどうなるかに注意してください。一方が通過した後、次の判断では、に等しいもう一方の判断も行われます。一緒に行けば大丈夫です。両側に1を追加します。
- 注==現在のポインタが単独で判断される場合、ポイントされている他のアドレスの内容を簡単に変更できます。Next.nextはここではお勧めしません。配列の場合は単独で判断しても問題ありませんが、リンクリストが乱雑なため、アドレスの内容が簡単に失われてしまいます。